#include "bsp_flash_config.h"
#include "bsp_uart.h"
#include "stimer.h"
#include "crc.h"
#define debug_printf(fmt, ...) UARTx_Printf(&huart3, fmt, ##__VA_ARGS__)

//    初始化标志
static char configInitFlag = 0;

//   系统配置信息定义
BSP_ConfigInfoTypeDef systemConfigInfo;


/**
 * @brief  Write data to flash
 * @param  buffer: pointer to data buffer
 * @param  size: data size
 * @retval HAL status
 */
HAL_StatusTypeDef bsp_flash_write_config(uint8_t *buffer, int size)
{
	stm32_flash_erase_page(BSP_FLASH_CFGSAVE_PAGE, BSP_FLASH_CFGSAVE_PAGE);
	return stm32_flash_write_page(BSP_FLASH_CFGSAVE_PAGE, buffer, size);
}

/**
 * @brief  read config data from flash
 * @param  buffer: pointer to data buffer
 * @param  size: data size
 * @retval HAL status
 */
HAL_StatusTypeDef bsp_flash_read_config(uint8_t *buffer, int size)
{
	return stm32_flash_read_page(BSP_FLASH_CFGSAVE_PAGE, buffer, size);
}

uint32_t bsp_crc_check(uint8_t *pdata, int size)
{
    return HAL_CRC_Calculate(&hcrc, (uint32_t *)pdata, size);
}

/*
函数名称: void bsp_flash_config_save_start(void)
函数功能：保存配置数据结构体
输入参数: 无
返回值：  无
*/
void bsp_flash_config_save_start(void)
{
    stimer_task_oneshot(bsp_flash_config_save, 500, 1, NULL);
}

/**
 * @brief 将配置参数写入flash
 * @param arg 无作用
 */
void bsp_flash_config_save(const void *arg)
{
    (void)arg;
    uint32_t crc32 = bsp_crc_check(((uint8_t *)&systemConfigInfo)+4, sizeof(systemConfigInfo)-4);
    systemConfigInfo.crc32 = crc32;
    bsp_flash_write_config((uint8_t *)&systemConfigInfo, sizeof(systemConfigInfo));
}

/*
函数名称: void bsp_flash_config_init(void)
函数功能：读取配置数据初始化，如果是第一次上电设置默认数据
输入参数: 无
返回值：  无
*/
void bsp_flash_config_init(void)
{
    //  读配置信息
    uint32_t crc32 = 0;
    if (configInitFlag == 1)
    {
        return;
    }
    configInitFlag = 1; //  初始化标志
    bsp_flash_read_config((uint8_t *)&systemConfigInfo, sizeof(systemConfigInfo));
    crc32 = bsp_crc_check((uint8_t *)&systemConfigInfo+4, sizeof(systemConfigInfo)-4);
    if (systemConfigInfo.crc32 != crc32)
    {
        systemConfigInfo.powerOnCount = 0;
        /* 这里添加第一次启动的初始化值 */

        /* ---------结束添加------- */
        bsp_flash_config_save(NULL); // 自动重新计算校验
        debug_printf("[sys] First power on\r\n");
    }
    else
    {
        systemConfigInfo.powerOnCount++;    //  记录开机次数
        bsp_flash_config_save(NULL);   //  保存信息
        // 开始读取Flash并初始化变量

        debug_printf("[sys] powerOnCount: %d, config struct size: %d(Byte),CRC:%X\r\n",
                     systemConfigInfo.powerOnCount, sizeof(systemConfigInfo), crc32);
    }
}
